/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unesp.demac.soo.dao;

import br.unesp.demac.bcc.soo.bean.Aluguel;
import br.unesp.demac.bcc.soo.bean.AluguelRel;
import br.unesp.demac.bcc.soo.bean.Dvd;
import br.unesp.demac.bcc.soo.bean.Modalidade;
import br.unesp.demac.bcc.soo.bean.Pessoa;
import br.unesp.demac.soo.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author flavioam
 */
public class AluguelDAOImp implements AluguelDAO {

    @Override
    public ArrayList<AluguelRel> selecionaDvdsAlugadosByCliente(Pessoa p, boolean tudo) {

        //if tudo is true, bring all movies
        //else bring just the current movies

        Connection con = null;
        ArrayList<AluguelRel> l = new ArrayList<AluguelRel>();

        try {

            con = FabricaConexao.getConexao();

            String sql = "";

            if (tudo) {

                sql = "select p.nome as nome, DATE(dataLocacao) as locacao, al.*, dvd.*, rel.*,md.*, rel.valor as realValor, DATE(dataCadastro) as realDataCadastro, "
                        + "dvd.nome as dvdNome, md.nome as modalidadeNome "
                        + "from locadora.Dvds as dvd "
                        + "inner join locadora.RelAlugueisDvds as rel on(rel.Dvds_idDvds = dvd.idDvds) "
                        + "inner join locadora.Alugueis as al on(rel.Alugueis_idAlugueis = al.idAlugueis) "
                        + "inner join locadora.Pessoas as p on(al.Pessoas_idPessoas = p.idPessoas) "
                        + "inner join locadora.Modalidades as md on(md.idModalidades = dvd.Modalidades_idModalidades) ";
                if (p.getIdPessoa() != 0) {
                    sql = sql
                            + "where al.Pessoas_idPessoas = ? ";
                }

            } else {

                sql = "select p.nome as nome, DATE(dataLocacao) as locacao, al.*, dvd.*, rel.*,md.*, rel.valor as realValor, DATE(dataCadastro) as realDataCadastro, "
                        + "dvd.nome as dvdNome, md.nome as modalidadeNome "
                        + "from Dvds as dvd "
                        + "inner join RelAlugueisDvds as rel on(rel.Dvds_idDvds = dvd.idDvds) "
                        + "inner join Alugueis as al on(rel.Alugueis_idAlugueis = al.idAlugueis) "
                        + "inner join Pessoas as p on(al.Pessoas_idPessoas = p.idPessoas) "
                        + "inner join Modalidades as md on(md.idModalidades = dvd.Modalidades_idModalidades) "
                        + "where dataDevolvido is null ";
                if (p.getIdPessoa() != 0) {
                    sql = sql
                            + "and al.Pessoas_idPessoas = ? ";
                }
            }
            sql = sql
                    + "order by rel.dataDevolvido desc ";

            PreparedStatement pstm = con.prepareStatement(sql);
            if (p.getIdPessoa() != 0) {
                pstm.setInt(1, p.getIdPessoa());
            }


            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                AluguelRel rel = new AluguelRel();

                Aluguel a = new Aluguel();
                a.setDataLocacao(rs.getDate("locacao"));
                a.setIdAluguel(rs.getInt("idAlugueis"));

                a.setPessoa(new Pessoa());
                a.getPessoa().setNome(rs.getString("nome"));

                rel.setDataDevolucao(rs.getDate("dataDevolucao"));
                rel.setDataDevolvido(rs.getDate("dataDevolvido"));

                rel.setPessoa(new Pessoa());
                rel.getPessoa().setNome(rs.getString("nome"));

                rel.setValor(rs.getDouble("realValor"));
                rel.setAluguel(a);

                Dvd d = new Dvd();
                d.setClassificacao(rs.getInt("classificacao"));
                d.setDataCadastro(rs.getDate("realDataCadastro"));
                d.setGenero(rs.getString("genero"));
                d.setIdDvd(rs.getInt("idDvds"));
                d.setNome(rs.getString("dvdNome"));

                Modalidade m = new Modalidade();
                m.setDiasDevolucao(rs.getInt("diasDevolucao"));
                m.setIdModalidade(rs.getInt("idModalidades"));
                m.setNome(rs.getString("modalidadeNome"));

                d.setModalidade(m);

                rel.setDvd(d);

                l.add(rel);

            }



        } catch (SQLException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            FabricaConexao.fechar(con);
            return l;
        }
    }

    @Override
    public ArrayList<AluguelRel> selecionaDvdsAtrasadosByCliente(Pessoa p) {

        //if tudo is true, bring all movies
        //else bring just the current movies

        Connection con = null;
        ArrayList<AluguelRel> l = new ArrayList<AluguelRel>();

        try {

            con = FabricaConexao.getConexao();

            String sql = "";

            sql = "select p.nome as nome, DATE(dataLocacao) as locacao, al.*, dvd.*, rel.*,md.*, rel.valor as realValor, DATE(dataCadastro) as realDataCadastro, "
                    + "dvd.nome as dvdNome, md.nome as modalidadeNome "
                    + "from Dvds as dvd "
                    + "inner join RelAlugueisDvds as rel on(rel.Dvds_idDvds = dvd.idDvds) "
                    + "inner join Alugueis as al on(rel.Alugueis_idAlugueis = al.idAlugueis) "
                    + "inner join Pessoas as p on(al.Pessoas_idPessoas = p.idPessoas) "
                    + "inner join Modalidades as md on(md.idModalidades = dvd.Modalidades_idModalidades) "
                    + "where dataDevolvido is null and rel.dataDevolucao < current_date() ";
            if (p.getIdPessoa() != 0) {
                sql = sql
                        + "and al.Pessoas_idPessoas = ? ";
            }

            sql = sql
                    + "order by rel.dataDevolucao asc ";

            PreparedStatement pstm = con.prepareStatement(sql);
            if (p.getIdPessoa() != 0) {
                pstm.setInt(1, p.getIdPessoa());
            }


            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                AluguelRel rel = new AluguelRel();

                Aluguel a = new Aluguel();
                a.setDataLocacao(rs.getDate("locacao"));
                a.setIdAluguel(rs.getInt("idAlugueis"));

                a.setPessoa(new Pessoa());
                a.getPessoa().setNome(rs.getString("nome"));

                rel.setDataDevolucao(rs.getDate("dataDevolucao"));
                rel.setDataDevolvido(rs.getDate("dataDevolvido"));

                rel.setPessoa(new Pessoa());
                rel.getPessoa().setNome(rs.getString("nome"));

                rel.setValor(rs.getDouble("realValor"));
                rel.setAluguel(a);

                Dvd d = new Dvd();
                d.setClassificacao(rs.getInt("classificacao"));
                d.setDataCadastro(rs.getDate("realDataCadastro"));
                d.setGenero(rs.getString("genero"));
                d.setIdDvd(rs.getInt("idDvds"));
                d.setNome(rs.getString("dvdNome"));

                Modalidade m = new Modalidade();
                m.setDiasDevolucao(rs.getInt("diasDevolucao"));
                m.setIdModalidade(rs.getInt("idModalidades"));
                m.setNome(rs.getString("modalidadeNome"));

                d.setModalidade(m);

                rel.setDvd(d);

                l.add(rel);

            }



        } catch (SQLException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            FabricaConexao.fechar(con);
            return l;
        }
    }
}
